day21 04 三级菜单
day21 04 三级菜单
1.使用递归调用的方法
整体代码类型比较简单如下:
menu={'北京':{'海淀':{'a':{},'h':{},'c':{}},'昌平':{'沙河':{},'天通苑':{},'回龙观':{}},'朝阳':{},'东城':{}} ,'上海':{'闵行':{'d':{},'f':{},'g':{}},'阐北':{},'浦东':{}} ,'山东':{}} l=[menu] def threeLM(dic): while True: for key in dic:print(key) key=input('input>>').strip() if key=='b' or key=='q':return key elif key in dic.keys() and dic[key]: ret=threeLM(dic[key]) if ret=='q':return 'q' threeLM(menu)
对每次用户输入与调用进行详细展开分析:
#第一次调用:dic=menu def threeLM(dic): while True:#进来就是死循环 for key in dic:print(key) #1. 打印 北京 上海 山东 key=input('input>>').strip() #2. 用户输入 北京 上海 山东 其中一个,假设输入北京 #6.用户输入 打印 海淀 昌平 朝阳 东城 其中一个,假设输入昌平 if key=='b' or key=='q':return key elif key in dic.keys() and dic[key]: #3. 输入的key在字典里面,且字典不为空 ret=threeLM(dic[key]) #4. 再次调用函数,把输入的字典传进去,比如输入北京则将 #18 接收#17返回的q ret=q # {'海淀':{'a':{},'b':{},'c':{}},'昌平':{'沙河':{},'天通苑':{},'回龙观':{}},'朝阳':{},'东城':{}} # 这个字典传进去,再次循环 if ret=='q':return 'q' #19 return q 函数就结束了,所以用户输入q结果就是退出程序 threeLM(menu) #第二次调用:dic={'海淀':{'a':{},'b':{},'c':{}},'昌平':{'沙河':{},'天通苑':{},'回龙观':{}},'朝阳':{},'东城':{}} def threeLM(dic): while True:#进来就是死循环 for key in dic:print(key) #5. 打印 海淀 昌平 朝阳 东城 #13 elif语句结束后 又开始循环,打印 海淀 昌平 朝阳 东城,所以#10的地方输入b结果就是返回上一级菜单 key=input('input>>').strip() #6. 用户输入 打印 海淀 昌平 朝阳 东城 其中一个,假设输入昌平 if key=='b' or key=='q':return key elif key in dic.keys() and dic[key]: #7. 输入的key在字典里面,且字典不为空 ret=threeLM(dic[key])#8. 再次调用函数,把输入的字典{'沙河':{},'天通苑':{},'回龙观':{}}传进去,再次循环 #12 接收#11返回的值,ret=b 不符合下面的if条件,所以elif语句结束了 #16 接收#15返回的值,ret=q 符合下面的if语句 if ret=='q':return 'q' #17 将q返回上个调用的地方,即#4的地方 threeLM(menu) #第三次调用:dic={'沙河':{},'天通苑':{},'回龙观':{}} def threeLM(dic): while True:#进来就是死循环 for key in dic:print(key) #9. 打印 沙河 天通苑 回龙观 key=input('input>>').strip() #10. 假设用户输入的是b #14 假设用户在这里输入q if key=='b' or key=='q':return key #11. return b 给前面调用的地方即‘#8’的地方 #15 return q给前面调用的地方 elif key in dic.keys() and dic[key]: ret=threeLM(dic[key]) if ret=='q':return 'q' threeLM(menu)
运行结果:
C:\Users\sku1-1\PycharmProjects\untitled\venv\Scripts\python.exe "C:/Users/sku1-1/PycharmProjects/untitled/day 21 04 三级菜单.py" 山东 北京 上海 input>>北京 昌平 海淀 东城 朝阳 input>>海淀 a c h input>>b 昌平 海淀 东城 朝阳 input>>q Process finished with exit code 0
其中比较绕的地方就是当用户输入b和q的时候了:
用户输入b----返回上一级菜单:利用给调用的地方(上一级菜单)返回一个值b,然后结束语句,就在上一级继续循环
用户输入q----退出程序:通过一层一层的返回q值,知道退出程序
2.使用堆栈的方法
代码如下:
menu={'北京':{'海淀':{'a':{},'h':{},'c':{}},'昌平':{'沙河':{},'天通苑':{},'回龙观':{}},'朝阳':{},'东城':{}} ,'上海':{'闵行':{'d':{},'f':{},'g':{}},'阐北':{},'浦东':{}} ,'山东':{}} l=[menu] #首先有一个栈 while True: for key in l[-1]:print(key)#l[-1]是最后一个值,从最后一个开始打印,先进后出 l[-1]=menu 打印北京 上海 山东 k=input('input>>').strip() #用户输入北京 if k in l[-1].keys() and l[-1][key]:#判断输入的在不再字典当中以及是不是为空,如果为真执行下面的代码 l.append(l[-1][k]) #将北京的字典放入l中,此时l=[menu,{海淀。。。。}],再while True 循环,又取的最后一个 #如果知道这里已经可以进去了,但是出不去 elif k=='b': l.pop() #把这一级菜单删除,直接就返回上级菜单 elif k=='q':break #用户输入q退出程序 else:continue
运行结果:
C:\Users\sku1-1\PycharmProjects\untitled\venv\Scripts\python.exe C:/Users/sku1-1/PycharmProjects/untitled/三级菜单.py 山东 北京 上海 input>>北京 东城 昌平 朝阳 海淀 input>>昌平 沙河 天通苑 回龙观 input>>b 东城 昌平 朝阳 海淀 input>>q Process finished with exit code 0
返回上一级菜单所作的操作:把原来所在的本级菜单直接删除,就剩下上一级菜单了